<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 构造函数：根据对象的属性，创建对象，动态给添加属性，返回这个对象。
        function Hero(name,age,sex,level){
            this.name=name;
            this.age=age;
            this.sex=sex;
            this.level=level;
            console.log(123);
            this.sing=function(address){
                console.log(`来${address}开演唱会`);
            }
            console.log(this);
        }
        let libai=new Hero('李白',33,true,19);
        let zhangfei=new Hero('张飞',44,true,22)
       /*  libai.sing('郑州');
        for(let key in libai){
            console.log(libai[key]);
        }
        console.log(libai.name);
        console.log(typeof libai); */

        /* 
          总结：
             1.构造函数就是类
             2.通过类这个模块，可以创建对象
             3.类是公共属性和方法的抽取
        */
       /* 
         构造函数：
            1.作用：创建对象
            2.返回值是一个对象，默认省略
            3.封装的代码时，给对象多态的添加属性和方法
            4.this是当前对象
            5.函数名用大驼峰
            6.配合关键字new使用
            7.构造函数和类是一码事
            8.就是对象公共属性和方法的抽取
            9.属性名和形参尽量保持一致，可读性强

            约定大于规范，规范大于编码
       */
    </script>
</body>
</html>